/*
 *
 * FocalTech TouchScreen driver.
 *
 * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

/*****************************************************************************
*
* File Name: focaltech_point_report_check.c
*
*    Author: WangTao
*
*   Created: 2016-11-16
*
*  Abstract: point report check function
*
*   Version: v1.0
*
* Revision History:
*        v1.0:
*            First release. By WangTao 2016-11-16
*****************************************************************************/

/*****************************************************************************
* Included header files
*****************************************************************************/
#include "focaltech_core.h"

#if FTS_POINT_REPORT_CHECK_EN
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define POINT_REPORT_CHECK_WAIT_TIME              200    //ms

/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/

/*****************************************************************************
* Static variables
*****************************************************************************/
static struct delayed_work fts_point_report_check_work;
static struct workqueue_struct *fts_point_report_check_workqueue = NULL;

/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/

/*****************************************************************************
* Static function prototypes
*****************************************************************************/

/*****************************************************************************
* functions body
*****************************************************************************/


/*****************************************************************************
*  Name: fts_point_report_check_func
*  Brief:
*  Input:
*  Output:
*  Return:
*****************************************************************************/
static void fts_point_report_check_func(struct work_struct *work)
{

#if FTS_MT_PROTOCOL_B_EN
    unsigned int finger_count=0;
#endif

    FTS_FUNC_ENTER();
    mutex_lock(&fts_wq_data->report_mutex);

#if FTS_MT_PROTOCOL_B_EN
    for (finger_count = 0; finger_count < fts_wq_data->pdata->max_touch_number; finger_count++)
    {
        input_mt_slot(fts_input_dev, finger_count);
        input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, false);
    }
#else
    input_mt_sync(fts_input_dev);
#endif
    input_report_key(fts_input_dev, BTN_TOUCH, 0);
    input_sync(fts_input_dev);

    mutex_unlock(&fts_wq_data->report_mutex);

    FTS_FUNC_EXIT();
}

void fts_point_report_check_queue_work(void)
{
    cancel_delayed_work(&fts_point_report_check_work);
    queue_delayed_work(fts_point_report_check_workqueue, &fts_point_report_check_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME));
}

/*****************************************************************************
*  Name: fts_point_report_check_init
*  Brief:
*  Input:
*  Output:
*  Return: < 0: Fail to create esd check queue
*****************************************************************************/
int fts_point_report_check_init(void)
{
    FTS_FUNC_ENTER();

    INIT_DELAYED_WORK(&fts_point_report_check_work, fts_point_report_check_func);
    fts_point_report_check_workqueue = create_workqueue("fts_point_report_check_func_wq");
    if (fts_point_report_check_workqueue == NULL)
    {
        FTS_ERROR("[POINT_REPORT]: Failed to create fts_point_report_check_workqueue!!");
    }
    else
    {
        FTS_DEBUG("[POINT_REPORT]: Success to create fts_point_report_check_workqueue!!");
    }

    FTS_FUNC_EXIT();

    return 0;
}

/*****************************************************************************
*  Name: fts_point_report_check_exit
*  Brief:
*  Input:
*  Output:
*  Return:
*****************************************************************************/
int fts_point_report_check_exit(void)
{
    FTS_FUNC_ENTER();

    destroy_workqueue(fts_point_report_check_workqueue);

    FTS_FUNC_EXIT();
    return 0;
}
#endif /* FTS_POINT_REPORT_CHECK_EN */

